<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>javascript 阶段</title>
</head>
<body>


    <script>
        // 原型
        // apply 
        // 实现面向对象的继承(业务逻辑比较多)
        // 类: 实际就是抽象的对象

        // 定义 Person 父类 
        function Person(name) {
            this.name = name;
            this.color = "黄色";
            this.style = "外观";
        }
        Person.prototype.sayHello = function(){
            console.log("你好!",this.name);
        }
        // 创建Person的实例
        var p1 = new  Person();

        
        // 定义 Student 子类
        function Student(_name){
            // 改变this指向, 复制属性
            Person.apply(this, [_name]);
        }
        // 原型
        Student.prototype = {
            constructor: Student,// 指明原型所属的构造函数
            sayHello: p1.sayHello
        }
        Student.prototype.doSomeThing = function(){
            console.log(this.name+"在做作业");
        }
        // 创建子类的实例
        var s1 = new Student("小明");
        console.log(s1.name);// "小明"
        console.log(s1);
        s1.sayHello();
        s1.doSomeThing();//处理子类Student自身的业务逻辑


        // 定义 Teacher 子类
        function Teacher(_name){
            // 改变this指向
            Person.apply(this,[_name])
        }
        // 原型对象
        Teacher.prototype = {
            constructor: Teacher,
            sayHello: p1.sayHello
        }
        Teacher.prototype.doSomeThing = function(){
            console.log(this.name+"在改作业");
        }
        // 创建Teacher实例
        var t1 = new Teacher("小罗");
        console.log(t1.name);// "小罗"
        console.log(t1);
        t1.sayHello();
        t1.doSomeThing();//处理子类Teacher自身的业务逻辑


        // 总结:
            // 面向对象中的继承性:
            // 父类对象属性和方法可以被共享(重复的数据或方法)
            // 子类对象是独立存在


    </script>
</body>
</html>